﻿#define  _CRT_SECURE_NO_WARNINGS 1
//1.某地发⽣了⼀件盗窃案，警察通过排查确定盗窃者必为4个嫌疑⼈的⼀个。
//以下为4个嫌疑⼈的供词 :
//A说：不是我。
//B说：是C。
//C说：是D。
//D说：C在胡说
//已知3个⼈说了真话，1个⼈说的是假话。
//现在请根据这些信息，写⼀个程序来确定到底谁是盗窃者。
#include <stdio.h>
//int main()
//{
//    // 定义盗窃者变量，ABCD分别代表四个嫌疑人
//    char thief;
//
//    // 循环遍历每个嫌疑人，依次假设他们是盗窃者进行验证
//    for (thief = 'A'; thief < 'D'; thief++)
//    {
//        // 定义变量记录说真话的人数
//        int trueCount = 0;
//
//        // A说：不是我。如果盗窃者不是A，则A说的是真话计数+1
//        if (thief != 'A')
//        {
//            trueCount++;
//        }
//
//        // B说：是c。如果盗窃者是c，则b说的是真话，计数+1
//        if (thief == 'C')
//        {
//            trueCount++;
//        }
//
//        // C说：是d。如果盗窃者是d，则c说的是真话，计数+1
//        if (thief == 'D')
//        {
//            trueCount++;
//        }
//
//        // D说:c在说胡话（即不是d）。如果盗窃者不是d，则d说的是真话，计数+1
//        if (thief != 'D')
//        {
//            trueCount++;
//        }
//
//        // 三个人说真话，1人假话。如果符合条件就可以找到盗窃者
//        if (trueCount == 3)
//        {
//            printf("盗窃者是: %c\n", thief);
//
//            // 找到后跳出循环
//            break;
//        }
//    }
//
//    return 0;
//}


//2.写⼀个代码打印1~100000之间的所有的⾃幂数，中间⽤空格分隔。
// ⾃幂数是指⼀个数的位数的n次⽅等于这个数本⾝。例如，153是⾃幂数，因为 1^3+5^3+3^3=153。
#include <math.h>
//int main()
//{
//    int i = 0;
//    for (i = 1; i <= 100000; i++)
//    {
//        // 1.计算i的位数
//        int n = 1; // 定义整型变量用于存储位数，至少是1位
//        int tmp = i;// 用tmp操作避免修改原数值i
//        while (tmp / 10) // tmp/10 =0就不在循环
//        {
//            n++; // 循环一次，位数n加1
//            tmp /= 10; // 将tmp/10去掉末尾的一位数字，逐步计算位数
//        }
//        // 2.计算i的每一位的n次方和
//
//        tmp = i; //重新赋值tmp = i
//        int sum = 0;
//        while (tmp) // 当tmp不为0试持续分离数字的每一位
//        {
//            //double pow(double base,double exponent) base 底数 exponent指数
//            // tmp%10得到个位
//            // 转换为int类型
//            sum += (int)pow(tmp % 10, n); // pow函数是用来计算底数的指数次幂 返回值是double
//            tmp /= 10;// 去除末尾已处理的一位数字
//        }
//
//        //3.输出
//        if (sum == i) // 判断是否是自幂数
//            printf("%d ", i);
//    }
//    return 0;
//}


                              
//3.输⼊10个整数，然后使⽤冒泡排序对数组内容进⾏升序排序，然后打印数组的内容
//测试1：
//输⼊：10 9 8 7 6 5 4 3 2 1
//输出：1 2 3 4 5 6 7 8 9 10
//测试2：
//输⼊：1 3 2 4 5 7 6 8 10 9
//输出：1 2 3 4 5 6 7 8 9 10
int main()
{
    // 定义一个整型数字，10个元素全部初始化为0
    int arr[10] = { 0 };

    // 计算数组arr的元素个数存入sz sizeof(arr)总字节  sizeof(arr[0])是单个元素字节
    int sz = sizeof(arr) / sizeof(arr[0]);

    // 后续要通过循环输入数据到数组，先定义循环变量i 初始化为0
    int i = 0;

    // i从0开始，只要i<数组元素个数sz（即10），就持续循环
    // 目的是遍历数组每个位置，为其输入数据
    for (i = 0; i < sz; i++)
    {
        // 从键盘获得数组arr的第i个元素输入值
        scanf("%d", &arr[i]);
    }

    //冒泡排序
    // 外层for循环：控制冒泡排序的轮次
    // 数组有sz个元素，最多需要sz-1轮排序（每轮让一个最大元素"冒泡"到末尾）
    for (i = 0; i < sz - 1; i++)
    {
        // 定义一个整型变量j用于内层循环控制
        int j = 0;
        //对未排序的元素进行冒泡排序
        //内层for循环：j从0开始，每次比较相邻元素arr[j]和arr[j+1]
        // sz-1-i表示:每轮排序后，末尾i个元素已排好序，无需比较
        for (j = 0; j < sz - 1; j++)
        {
            // 相邻元素顺序错误，进行交换
            // 判断相邻元素大小关系 如果前者大于后者 说明顺序错误，要升序排列
            if (arr[j] > arr[j + 1])
            {
                // 定义临时变量tmp用于交换两个元素时暂存数据
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
    // 输出
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }

    return 0;
}